package com.itheima.d1_collection_set;

import com.itheima.d1_collection_set.bean.Student;

import java.util.HashSet;

/**
 * 目标：自定义的类型的对象，比如两个内容一样的学生对象，如果让HashSet集合能够去重复！
 *
 * 当集合底层结构时哈希表结构，要想让存储的自定义类型对象能够去重，就得对这个类型进行重写hashCode和equals方法
 */
public class SetTest3 {
    public static void main(String[] args) {
        HashSet<Student> students = new HashSet<>();
        students.add(new Student("张三", 18, 185));
        students.add(new Student("张三", 18, 185));

//        System.out.println("students = " + students);

        students.forEach(System.out::println);

        /*
        * 没有重写hashCode和equals方法之前：
        *   students = [Student{name='张三', age=18, height=185.0}, Student{name='张三', age=18, height=185.0}]
        *   为什么（没有去重复）？
        *       new了两个对象，每个对象的hashCode近似于地址，hash值不同，进一步对数组长度取余运算，得到的位置不同，两个都会存储下来
        *       即便是不同的哈希值，但取余运算得到的是相同的位置，那也会进一步比较equals，此时的equals方法还没有重写，默认比较的是真实的地址是否相同
        *
        * 如果想要达到同类型的不同对象，当属性值都相同时，然后能够起到去重复的效果，只要重写hashCode和equals方法就可以
        * */
    }
}
